package persistencia.repositorio;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.ejb.EntityManagerFactoryImpl;
import org.hibernate.ejb.EntityManagerImpl;

import entidade.Departamento;

import persistencia.unidadepersistencia.UnidadePersistencia;

public class RepositorioDepartamento {

	//Instância da classe 
	public static RepositorioDepartamento instanceRepositorioDepartamento;
	//Instância do Gerenciador de entidades
	private EntityManager em = UnidadePersistencia.getInstanceUnidadePersistencia().getEntityManager();
	//Atributo secao será usado para fazer busca com o criteria
	private Session secao;

	//Método para obter a instância da classe
	public static RepositorioDepartamento getInstanceRepositorioDepartamento(){
		if(instanceRepositorioDepartamento == null){
			instanceRepositorioDepartamento = new RepositorioDepartamento();
		}
		return instanceRepositorioDepartamento;
	}

	//Método para obter uma Session
	private Session getSession(){

		if(em.getDelegate() instanceof EntityManagerFactoryImpl){
			EntityManagerImpl emi = (EntityManagerImpl) em.getDelegate();
			secao = emi.getSession();
		}else{
			secao = (Session) em.getDelegate();
		}
		return secao;		
	}

	public void novo(Departamento novoDepartamento){
		em.getTransaction().begin();
		em.persist(novoDepartamento);
		em.getTransaction().commit();
	}

	public void remover(Departamento departamentoARemover){
		em.getTransaction().begin();
		em.remove(departamentoARemover);
		em.getTransaction().commit();
	}

	public void atualizar(Departamento departamentoAAtualizar){
		em.getTransaction().begin();
		em.merge(departamentoAAtualizar);
		em.getTransaction().commit();
	}

	public Departamento buscarId(Integer id){

		em.getTransaction().begin();		
		Departamento d = em.getReference(Departamento.class, id);
		em.getTransaction().commit();
		return d;
	}

	public List<Departamento> buscarNome(String nome){ 
		Criteria cri = getSession().createCriteria(Departamento.class);
		cri.add(Restrictions.like("nomeDepartamento", "%"+nome+"%"));
		List<Departamento> lista = cri.list();
		return lista;
	} 

	public List<Departamento> listarTodos(){
		CriteriaBuilder builder = em.getCriteriaBuilder();
		CriteriaQuery<Departamento> criteria = builder.createQuery(Departamento.class);
		criteria.from(Departamento.class);
		return em.createQuery(criteria).getResultList();
	}

}
